<?php

include_once '../model/Constructora.php';
include_once '../model/Obra.php';
include_once '../model/Etapa.php';
include_once '../model/Categoria.php';
include_once '../model/CategoriaAvance.php';
include_once '../model/Item.php';
include_once '../model/ItemAvance.php';
include_once '../model/Usuario.php';
include_once '../daos/AvanceDao.php';
include_once '../daos/ConstrucDao.php';
include_once '../daos/ObraDao.php';
include_once '../daos/EtapaDao.php';
include_once '../daos/UsuarioDao.php';
include_once '../reports/ReportsManager.php';
include_once '../commons/Gmail.php';
include_once '../commons/Constants.php';

class AvanceController {

    public function __construct() {
        
    }

    public function avancesMes() {

        session_start();

        $msj = "Error consultando los avances del mes, por favor intente más tarde";
        $view = "../views/home.php";

        try {

            $oUser = new Usuario();
            $oUser = unserialize($_SESSION['usuario']);

            $aDao = new AvanceDao();
            unset($_SESSION['avancesDelMes']);


            if ($oUser->getRol()->getDescripcion() == CLIENTE) {

                $listAvances = $aDao->getAvance();

                $eDao = new EtapaDao();
                $etapa = $eDao->getEtapaById($dao->getEtapaByClient($oUser->getId()));
                if (isset($etapa)) {
                    $i = 0;
                    $j = 0;

                    $list = array();
                    for ($i = 0; $i < count($listAvances); $i++) {
                        $avance = new Avance();
                        $avance = $listAvances[$i];
                        if ($etapa->getId() == $avance->getEtapa()->getId()) {
                            $list[$j++] = $avance;
                        }
                        if (count($list) > 0) {
                            $_SESSION['avancesDelMes'] = serialize($list);
                        }
                    }
                }
            } else {
                $listAvances = $aDao->getAvanceByDate(date('Y-m-01'), date('Y-m-d'));
                if (count($listAvances) > 0) {
                    $_SESSION['avancesDelMes'] = serialize($listAvances);
                }
            }

            $msj = "";
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return $view;
    }

    public function loadConstructoras() {

        session_start();

        $view = "../views/avances.php";

        try {

            $dao = new ConstrucDao();

            $constructoras = array();
            $constructoras = $dao->getConstructoras();

            $_SESSION['constructoras'] = null;
            if (isset($constructoras)) {
                $_SESSION['constructoras'] = serialize($constructoras);
                $msj = "";
            }

            unset($_SESSION['listAvances']);
            unset($_SESSION['etapa']);
            unset($_SESSION['obra']);
            unset($_SESSION['constructora']);
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return $view;
    }

    public function loadObras() {

        session_start();

        $responce = array('msj' => "Error consultando obras", 'estatus' => AJAX_ERROR);

        try {

            $dao = new ObraDao();

            $obras = array();
            $obras = $dao->getObrasByConstruc($_POST['constru']);

            if (isset($obras) && count($obras) > 0) {

                $i = 0;
                $list = array();
                for ($i = 0; $i < count($obras); $i++) {
                    $list[$i] = array("key" => $obras[$i]->getId(), "val" => $obras[$i]->getNombre());
                }

                $responce = array('msj' => '', 'estatus' => AJAX_SUCCESSFUL, 'obras' => $list);
            } else {
                $responce = array('msj' => "La constructora no tiene obras asociadas", 'estatus' => AJAX_ERROR);
            }
        } catch (Exception $e) {
            
        }

        return json_encode($responce);
    }

    public function loadEtapas() {

        session_start();

        $responce = array('msj' => "Error consultando etapas", 'estatus' => AJAX_ERROR);

        try {

            $dao = new EtapaDao();

            $etapas = array();
            $etapas = $dao->getEtapasByObra($_POST['obra']);

            if (isset($etapas) && count($etapas) > 0) {

                $i = 0;
                $list = array();
                for ($i = 0; $i < count($etapas); $i++) {
                    $list[$i] = array("key" => $etapas[$i]->getId(), "val" => $etapas[$i]->getNombre());
                }

                $responce = array('msj' => '', 'estatus' => AJAX_SUCCESSFUL, 'etapas' => $list);
            } else {
                $responce = array('msj' => "La obra no tiene etapas asociadas", 'estatus' => AJAX_ERROR);
            }
        } catch (Exception $e) {
            
        }

        return json_encode($responce);
    }

    public function listar() {

        session_start();

        $msj = "Error consultando los avances, por favor intente más tarde";
        $view = "../views/listAvances.php";

        try {

            if (!isset($_SESSION['etapa'])) {
                $id = $_POST['etapa'];
            } else {
                $etapa = unserialize($_SESSION['etapa']);
                $id = $etapa->getId();
            }


            $aDao = new AvanceDao();
            $eDao = new EtapaDao();

            $etapa = new Etapa();
            $etapa = $eDao->getEtapaById($id);

            $listAvances = $aDao->getAvanceByEtapa($id);

            $_SESSION['listAvances'] = serialize($listAvances);
            $_SESSION['etapa'] = serialize($etapa);
            $_SESSION['obra'] = serialize($etapa->getObra());
            $_SESSION['constructora'] = serialize($etapa->getObra()->getConstructora());

            unset($_SESSION['listCategorias']);
            unset($_SESSION['avance']);

            $msj = "";
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return $view;
    }

    public function newAvance() {

        session_start();

        $msj = "Error configurando la planilla, por favor intente más tarde";
        $view = "../views/newAvance.php";

        try {

            $cDao = new CategoriaDao();
            $listCategorias = $cDao->getCategorias();
            $_SESSION['listCategorias'] = serialize($listCategorias);

            $msj = "";
        } catch (Exception $e) {
            
        }
        $_SESSION['msj'] = $msj;
        return $view;
    }

    public function salvarNuevo() {

        session_start();

        $msj = "Error salvando el avance";
        $view = "../views/listAvances.php";

        try {

            $i = 0;

            $porc = 0;

            $etapa = new Etapa();
            $etapa = unserialize($_SESSION['etapa']);

            $usuario = unserialize($_SESSION['usuario']);
            $listCategorias = unserialize($_SESSION['listCategorias']);

            $aDao = new AvanceDao();


            $aDao->closeAvancesByEtapa($etapa->getId());

            $avance = new Avance();
            $avance->setCerrado("N");
            $avance->setEtapa($etapa);
            $avance->setFechaAvance(date("Y-m-d"));
            $avance->setInspector($usuario);
            $avance->setObservaciones($_POST['observaciones']);
            $avance = $aDao->saveAvance($avance);

            for ($i = 0; $i < count($listCategorias); $i++) {

                $porc = 0;

                $categoria = new Categoria();
                $categoria = $listCategorias[$i];

                $categoriaAvance = new CategoriaAvance();
                $categoriaAvance->setAvance($avance);
                $categoriaAvance->setCategoria($categoria);
                $categoriaAvance->setObservaciones($_POST['observa_' . $categoria->getId()]);
                $categoriaAvance->setPorAvance(0);
                $categoriaAvance = $aDao->saveCategoria($categoriaAvance);

                $j = 0;
                for ($j = 0; $j < count($categoria->getItems()); $j++) {

                    $listItem = $categoria->getItems();
                    $item = new Item();
                    $item = $listItem[$j];

                    $ia = new ItemAvance();
                    if ($_POST['inicio_' . $categoria->getId() . '_' . $item->getId()] != "") {
                        $ia->setFechaInicio(date('Y-m-d', strtotime($_POST['inicio_' . $categoria->getId() . '_' . $item->getId()])));
                    } else {
                        $ia->setFechaInicio(NULLTODATE);
                    }
                    if ($_POST['fin_' . $categoria->getId() . '_' . $item->getId()] != "") {
                        $ia->setFechaFin(date('Y-m-d', strtotime($_POST['fin_' . $categoria->getId() . '_' . $item->getId()])));
                    } else {
                        $ia->setFechaFin(NULLTODATE);
                    }

                    $ia->setConforme($_POST['conforme_' . $categoria->getId() . '_' . $item->getId()]);
                    $ia->setCategoriaAvance($categoriaAvance);
                    $ia->setItem($item);

                    $ia = $aDao->saveItem($ia);

                    if ($_POST['conforme_' . $categoria->getId() . '_' . $item->getId()] == 'S') {
                        $porc++;
                    }
                }

                $categoriaAvance->setPorAvance(($porc * 100) / count($categoria->getItems()));

                $categoriaAvance = $aDao->updateCatAvance($categoriaAvance);
            }

            $view = "../views/fotos.php";
            $msj = "Avance salvado satisfactoriamente";

            unset($_SESSION['fotos']);
            unset($_SESSION['pdf']);
            $_SESSION['avance'] = serialize($avance);
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return $view;
    }

    function addPicture() {

        session_start();

        try {

            $avance = unserialize($_SESSION['avance']);

            $nombre = $_FILES['foto']['name'];
//            $ext = $_FILES['foto']['type'];
            $tam = $_FILES['foto']['size'];

            $pathTmp = PATH_TEMP . $nombre;

            $fp = fopen($_FILES['foto']['tmp_name'], "rb");
            $contenido = fread($fp, $tam);
            $img = fopen($pathTmp, 'w+');
            fwrite($img, $contenido);
            fclose($img);
            $contenido = addslashes($contenido);
            fclose($fp);

            $foto = new Foto();
            $foto->setDescripcion($_POST['obser']);
            $foto->setArchivo($contenido);
            $foto->setAvance($avance);

            $aDao = new AvanceDao();
            $foto = $aDao->saveFoto($foto);

            if (isset($_SESSION['fotos'])) {
                $fotos = unserialize($_SESSION['fotos']);
            } else {
                $fotos = array();
            }

            $fotos[count($fotos)] = $pathTmp;
            $_SESSION['fotos'] = serialize($fotos);

            if ($foto->getId() > 0) {
                $msj = "Imagen guardada satisfactoriamente";
            }
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return "../views/fotos.php";
    }

    public function reporte() {

        session_start();

        $avance = new Avance();
        $avance = unserialize($_SESSION['avance']);
        $msj = "Ha ocurrido un reporte, por favor intente más tarde.";

        try {
            $rm = new ReportsManager();

            $path = session_id() . ".pdf";
            $rm->generarReporteAvance("tmp\\" . $path, $avance->getId());
            $_SESSION["pdf"] = "../tmp/" . $path;
            $msj = "Reporte Generado Satisfactoriamente";
        } catch (Exception $e) {
            
        }
        $_SESSION['msj'] = $msj;
        return "../views/reporte.php";
    }

    public function reporteAjax() {

        session_start();

        $responce = array('msj' => "Ha ocurrido un reporte, por favor intente más tarde.", 'estatus' => AJAX_ERROR);

        try {
            $rm = new ReportsManager();

            $path = session_id() . ".pdf";
            $rm->generarReporteAvance("tmp\\" . $path, $_POST['idAvance']);

            $responce = array('msj' => "Reporte Generado Satisfactoriamente",
                'estatus' => AJAX_SUCCESSFUL,
                'path' => "../tmp/" . $path);
        } catch (Exception $e) {
            
        }
        return json_encode($responce);
    }

    public function correos() {

        session_start();

        $msj = "Error enviando los correos";

        $avance = new Avance();
        $avance = unserialize($_SESSION['avance']);

        try {
            $gmail = new Gmail();

            $asunto = "Ficha de Avance";
            $msg = "<h1>Sistema de Gestión de Obras Tipo Tunel, Municipio Bolivariano Plaza.</h1>";
            $msg .= "<br/><br/>";
            $msg .= "<h2>Ficha de Avance del SGTunel</h2>";
            $msg .= "<br/><br/>";
            $msg .= "<h2>Mensaje enviado de manera automarita, por favor no responder.</h2>";

            $i = 0;
            $j = 0;
            $address = array();

            $dao = new UsuarioDao();

            $clientes = $dao->getUsuariosByEtapa($avance->getEtapa()->getId());

            for ($i = 0; $i < count($clientes); $i++) {
                if ($clientes[$i]->getCorreo() != "") {
                    $address[$j++] = $clientes[$i]->getCorreo();
                }
            }

            $gmail->send($address, $asunto, $msg, $_SESSION["pdf"]);

            $msj = "Correos enviados satisfactoriamente";
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return $this->listar();
    }

    public function correosAjax() {

        session_start();

        $responce = array('msj' => "Error enviando los correos, por favor intente más tarde.", 'estatus' => AJAX_ERROR);

        try {

            $aDao = new AvanceDao();
            $avance = $aDao->getAvanceById($_POST['idAvance']);

            $rm = new ReportsManager();

            $path = session_id() . ".pdf";
            $rm->generarReporteAvance("tmp\\" . $path, $avance->getId());

            $gmail = new Gmail();

            $asunto = "Ficha de Avance";
            $msg = "<h1>Sistema de Gestión de Obras Tipo Tunel, Municipio Bolivariano Plaza.</h1>";
            $msg .= "<br/><br/>";
            $msg .= "<h2>Ficha de Avance del SGTunel</h2>";
            $msg .= "<br/><br/>";
            $msg .= "<h2>Mensaje enviado de manera automarita, por favor no responder.</h2>";

            $i = 0;
            $j = 0;
            $address = array();

            $dao = new UsuarioDao();

            $clientes = $dao->getUsuariosByEtapa($avance->getEtapa()->getId());

            for ($i = 0; $i < count($clientes); $i++) {
                if ($clientes[$i]->getCorreo() != "") {
                    $address[$j++] = $clientes[$i]->getCorreo();
                }
            }

            if ($gmail->send($address, $asunto, $msg, "../tmp/" . $path)) {
                $responce = array('msj' => "Correos enviados satisfactoriamente",
                    'estatus' => AJAX_SUCCESSFUL);
            }
        } catch (Exception $e) {
            
        }

        return json_encode($responce);
    }

    public function query() {

        session_start();
        $view = "../views/listAvances.php";

        $msj = "Error consultando el avance";

        try {

            $aDao = new AvanceDao();
            $avance = $aDao->getAvanceById($_POST['id']);

            if ($avance->getCerrado() == "N") {

                $usuario = new Usuario();
                $usuario = unserialize($_SESSION['usuario']);

                if ($usuario->getId() == $avance->getInspector()->getId()) {

                    $msj = "Avance consultado satisfactoriamente, proceda a editarlo";
                    $view = "../views/editAvance.php";
                    $_SESSION['avance'] = serialize($avance);
                    $_SESSION['constructora'] = serialize($avance->getEtapa()->getObra()->getConstructora());
                    $_SESSION['obra'] = serialize($avance->getEtapa()->getObra());
                    $_SESSION['etapa'] = serialize($avance->getEtapa());
                } else {
                    $msj = "Este avance solo se puede editar por " . $avance->getInspector()->getNombre() . " " . $avance->getInspector()->getApellido();
                }
            } else {
                $msj = "El Avance se encuenta cerrado. Ya no se puede editar.";
            }
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return $view;
    }

    public function salvarEditado() {

        session_start();

        $msj = "Error salvando el avance";
        $view = "../views/listAvances.php";

        try {

            $i = 0;
            $porc = 0;

            $aDao = new AvanceDao();

            $avance = new Avance();
            $avance = unserialize($_SESSION['avance']);

            $avance->setObservaciones($_POST['observaciones']);
            $avance = $aDao->updateAvance($avance);

            $listCategorias = $avance->getCategorias();

            for ($i = 0; $i < count($listCategorias); $i++) {

                $porc = 0;

                $categoria = new CategoriaAvance();
                $categoria = $listCategorias[$i];
                $categoria->setObservaciones($_POST['observa_' . $categoria->getId()]);

                $j = 0;
                for ($j = 0; $j < count($categoria->getItems()); $j++) {

                    $listItem = $categoria->getItems();
                    $item = new ItemAvance();
                    $item = $listItem[$j];

                    if ($_POST['inicio_' . $item->getId()] != "") {
                        $item->setFechaInicio(date('Y-m-d', strtotime($_POST['inicio_' . $item->getId()])));
                    } else {
                        $item->setFechaInicio(NULLTODATE);
                    }
                    if ($_POST['fin_' . $item->getId()] != "") {
                        $item->setFechaFin(date('Y-m-d', strtotime($_POST['fin_' . $item->getId()])));
                    } else {
                        $item->setFechaFin(NULLTODATE);
                    }

                    $item->setConforme($_POST['conforme_' . $item->getId()]);

                    $item = $aDao->updateItemAvance($item);

                    if ($_POST['conforme_' . $item->getId()] == 'S') {
                        $porc++;
                    }
                }

                $categoria->setPorAvance(($porc * 100) / count($categoria->getItems()));

                $categoria = $aDao->updateCatAvance($categoria);
            }

            unset($_SESSION['fotos']);
            unset($_SESSION['pdf']);
            $_SESSION['avance'] = serialize($avance);

            $fotos = array();
            $listFotos = $avance->getFotos();
            for ($i = 0; $i < count($listFotos); $i++) {

                $foto = new Foto();
                $foto = $listFotos[$i];
                $pathTmp = PATH_TEMP . $foto->getId() . ".png";

                $img = fopen($pathTmp, 'w+');
                fwrite($img, $foto->getArchivo());
                fclose($img);

                $fotos[$i] = $pathTmp;
            }

            if (count($fotos) > 0) {
                $_SESSION['fotos'] = serialize($fotos);
            }

            $view = "../views/fotos.php";
            $msj = "Avance salvado satisfactoriamente";
        } catch (Exception $e) {
            
        }

        $_SESSION['msj'] = $msj;
        return $view;
    }

}

?>